<?php

namespace JLPay\Models\Trans\C2b;

use JLPay\Models\BaseRequest;
use JLPay\Models\Trans\Dto\TerminalInfoDto;

/**
 * 二维码支付预授权请求模型
 */
class QrcodePayPreAuthRequest extends BaseRequest
{
    /**
     * API URL
     */
    public const API_URL = "/open/trans/qrcodepaypreauth";

    /**
     * @var string|null 商户号
     */
    private ?string $mchId = null;

    /**
     * @var string|null 终端号
     */
    private ?string $termNo = null;

    /**
     * @var string|null 交易类型
     */
    private ?string $payType = null;

    /**
     * @var string|null 外部订单号
     */
    private ?string $outTradeNo = null;

    /**
     * @var string|null 订单有效期
     */
    private ?string $paymentValidTime = null;

    /**
     * @var string|null 商品标题
     */
    private ?string $body = null;

    /**
     * @var string|null 商品描述
     */
    private ?string $attach = null;

    /**
     * @var string|null 交易金额
     */
    private ?string $totalFee = null;

    /**
     * @var string|null 备注
     */
    private ?string $remark = null;

    /**
     * @var string|null 通知地址
     */
    private ?string $notifyUrl = null;

    /**
     * @var string|null 操作员
     */
    private ?string $opUserId = null;

    /**
     * @var string|null 门店号
     */
    private ?string $opShopId = null;

    /**
     * @var string|null 终端设备号
     */
    private ?string $deviceInfo = null;

    /**
     * @var string|null 商户IP
     */
    private ?string $mchCreateIp = null;

    /**
     * @var string|null 交易地址
     */
    private ?string $transAddress = null;

    /**
     * @var string|null 交易地区码
     */
    private ?string $areaCode = null;

    /**
     * @var string|null 经度
     */
    private ?string $longitude = null;

    /**
     * @var string|null 纬度
     */
    private ?string $latitude = null;

    /**
     * @var string|null 子商户appid
     */
    private ?string $subAppid = null;

    /**
     * @var TerminalInfoDto|null 终端信息
     */
    private ?TerminalInfoDto $terminalInfo = null;

    /**
     * 设置商户号
     *
     * @param string $mchId 商户号
     * @return $this
     */
    public function setMchId(string $mchId): self
    {
        $this->mchId = $mchId;
        return $this;
    }

    /**
     * 获取商户号
     *
     * @return string|null 商户号
     */
    public function getMchId(): ?string
    {
        return $this->mchId;
    }

    /**
     * 设置终端号
     *
     * @param string $termNo 终端号
     * @return $this
     */
    public function setTermNo(string $termNo): self
    {
        $this->termNo = $termNo;
        return $this;
    }

    /**
     * 获取终端号
     *
     * @return string|null 终端号
     */
    public function getTermNo(): ?string
    {
        return $this->termNo;
    }

    /**
     * 设置交易类型
     *
     * @param string $payType 交易类型
     * @return $this
     */
    public function setPayType(string $payType): self
    {
        $this->payType = $payType;
        return $this;
    }

    /**
     * 获取交易类型
     *
     * @return string|null 交易类型
     */
    public function getPayType(): ?string
    {
        return $this->payType;
    }

    /**
     * 设置外部订单号
     *
     * @param string $outTradeNo 外部订单号
     * @return $this
     */
    public function setOutTradeNo(string $outTradeNo): self
    {
        $this->outTradeNo = $outTradeNo;
        return $this;
    }

    /**
     * 获取外部订单号
     *
     * @return string|null 外部订单号
     */
    public function getOutTradeNo(): ?string
    {
        return $this->outTradeNo;
    }

    /**
     * 设置订单有效期
     *
     * @param string $paymentValidTime 订单有效期
     * @return $this
     */
    public function setPaymentValidTime(string $paymentValidTime): self
    {
        $this->paymentValidTime = $paymentValidTime;
        return $this;
    }

    /**
     * 获取订单有效期
     *
     * @return string|null 订单有效期
     */
    public function getPaymentValidTime(): ?string
    {
        return $this->paymentValidTime;
    }

    /**
     * 设置商品标题
     *
     * @param string $body 商品标题
     * @return $this
     */
    public function setBody(string $body): self
    {
        $this->body = $body;
        return $this;
    }

    /**
     * 获取商品标题
     *
     * @return string|null 商品标题
     */
    public function getBody(): ?string
    {
        return $this->body;
    }

    /**
     * 设置商品描述
     *
     * @param string $attach 商品描述
     * @return $this
     */
    public function setAttach(string $attach): self
    {
        $this->attach = $attach;
        return $this;
    }

    /**
     * 获取商品描述
     *
     * @return string|null 商品描述
     */
    public function getAttach(): ?string
    {
        return $this->attach;
    }

    /**
     * 设置交易金额
     *
     * @param string $totalFee 交易金额
     * @return $this
     */
    public function setTotalFee(string $totalFee): self
    {
        $this->totalFee = $totalFee;
        return $this;
    }

    /**
     * 获取交易金额
     *
     * @return string|null 交易金额
     */
    public function getTotalFee(): ?string
    {
        return $this->totalFee;
    }

    /**
     * 设置备注
     *
     * @param string $remark 备注
     * @return $this
     */
    public function setRemark(string $remark): self
    {
        $this->remark = $remark;
        return $this;
    }

    /**
     * 获取备注
     *
     * @return string|null 备注
     */
    public function getRemark(): ?string
    {
        return $this->remark;
    }

    /**
     * 设置通知地址
     *
     * @param string $notifyUrl 通知地址
     * @return $this
     */
    public function setNotifyUrl(string $notifyUrl): self
    {
        $this->notifyUrl = $notifyUrl;
        return $this;
    }

    /**
     * 获取通知地址
     *
     * @return string|null 通知地址
     */
    public function getNotifyUrl(): ?string
    {
        return $this->notifyUrl;
    }

    /**
     * 设置操作员
     *
     * @param string $opUserId 操作员
     * @return $this
     */
    public function setOpUserId(string $opUserId): self
    {
        $this->opUserId = $opUserId;
        return $this;
    }

    /**
     * 获取操作员
     *
     * @return string|null 操作员
     */
    public function getOpUserId(): ?string
    {
        return $this->opUserId;
    }

    /**
     * 设置门店号
     *
     * @param string $opShopId 门店号
     * @return $this
     */
    public function setOpShopId(string $opShopId): self
    {
        $this->opShopId = $opShopId;
        return $this;
    }

    /**
     * 获取门店号
     *
     * @return string|null 门店号
     */
    public function getOpShopId(): ?string
    {
        return $this->opShopId;
    }

    /**
     * 设置终端设备号
     *
     * @param string $deviceInfo 终端设备号
     * @return $this
     */
    public function setDeviceInfo(string $deviceInfo): self
    {
        $this->deviceInfo = $deviceInfo;
        return $this;
    }

    /**
     * 获取终端设备号
     *
     * @return string|null 终端设备号
     */
    public function getDeviceInfo(): ?string
    {
        return $this->deviceInfo;
    }

    /**
     * 设置商户IP
     *
     * @param string $mchCreateIp 商户IP
     * @return $this
     */
    public function setMchCreateIp(string $mchCreateIp): self
    {
        $this->mchCreateIp = $mchCreateIp;
        return $this;
    }

    /**
     * 获取商户IP
     *
     * @return string|null 商户IP
     */
    public function getMchCreateIp(): ?string
    {
        return $this->mchCreateIp;
    }

    /**
     * 设置交易地址
     *
     * @param string $transAddress 交易地址
     * @return $this
     */
    public function setTransAddress(string $transAddress): self
    {
        $this->transAddress = $transAddress;
        return $this;
    }

    /**
     * 获取交易地址
     *
     * @return string|null 交易地址
     */
    public function getTransAddress(): ?string
    {
        return $this->transAddress;
    }

    /**
     * 设置交易地区码
     *
     * @param string $areaCode 交易地区码
     * @return $this
     */
    public function setAreaCode(string $areaCode): self
    {
        $this->areaCode = $areaCode;
        return $this;
    }

    /**
     * 获取交易地区码
     *
     * @return string|null 交易地区码
     */
    public function getAreaCode(): ?string
    {
        return $this->areaCode;
    }

    /**
     * 设置经度
     *
     * @param string $longitude 经度
     * @return $this
     */
    public function setLongitude(string $longitude): self
    {
        $this->longitude = $longitude;
        return $this;
    }

    /**
     * 获取经度
     *
     * @return string|null 经度
     */
    public function getLongitude(): ?string
    {
        return $this->longitude;
    }

    /**
     * 设置纬度
     *
     * @param string $latitude 纬度
     * @return $this
     */
    public function setLatitude(string $latitude): self
    {
        $this->latitude = $latitude;
        return $this;
    }

    /**
     * 获取纬度
     *
     * @return string|null 纬度
     */
    public function getLatitude(): ?string
    {
        return $this->latitude;
    }

    /**
     * 设置子商户appid
     *
     * @param string $subAppid 子商户appid
     * @return $this
     */
    public function setSubAppid(string $subAppid): self
    {
        $this->subAppid = $subAppid;
        return $this;
    }

    /**
     * 获取子商户appid
     *
     * @return string|null 子商户appid
     */
    public function getSubAppid(): ?string
    {
        return $this->subAppid;
    }

    /**
     * 设置终端信息
     *
     * @param TerminalInfoDto $terminalInfo 终端信息
     * @return $this
     */
    public function setTerminalInfo(TerminalInfoDto $terminalInfo): self
    {
        $this->terminalInfo = $terminalInfo;
        return $this;
    }

    /**
     * 获取终端信息
     *
     * @return TerminalInfoDto|null 终端信息
     */
    public function getTerminalInfo(): ?TerminalInfoDto
    {
        return $this->terminalInfo;
    }

    /**
     * 转换为数组格式
     *
     * @return array 数组格式的数据
     */
    public function toArray(): array
    {
        $data = parent::toArray();
        $data = array_merge($data, [
            'mch_id' => $this->mchId,
            'term_no' => $this->termNo,
            'pay_type' => $this->payType,
            'out_trade_no' => $this->outTradeNo,
            'payment_valid_time' => $this->paymentValidTime,
            'body' => $this->body,
            'attach' => $this->attach,
            'total_fee' => $this->totalFee,
            'remark' => $this->remark,
            'notify_url' => $this->notifyUrl,
            'op_user_id' => $this->opUserId,
            'op_shop_id' => $this->opShopId,
            'device_info' => $this->deviceInfo,
            'mch_create_ip' => $this->mchCreateIp,
            'trans_address' => $this->transAddress,
            'area_code' => $this->areaCode,
            'longitude' => $this->longitude,
            'latitude' => $this->latitude,
            'sub_appid' => $this->subAppid
        ]);

        if ($this->terminalInfo) {
            $data['terminal_info'] = $this->terminalInfo->toArray();
        }

        return $data;
    }
} 